///////////////////////////////////////
////     ANALIZADOR SINTÁCTICO     ////
///////////////////////////////////////

parser grammar Anasint;

options {
  tokenVocab = Analex;
}

@header {
  package practpl.cinco;
}

/*Principal*/
flex:(
		   primera_seccion {System.out.println("Reconocida Primera Seccion");}
		   SEPARADOR
		   segunda_seccion {System.out.println("Reconocida Segunda Seccion");}
		   SEPARADOR 
		   tercera_seccion {System.out.println("Reconocida Tercera Seccion");}
		   EOF
   ) ;


//Sección de declaraciones
primera_seccion: ((definicion)+) (definicion_codigo_C)? ;

definicion: (NOMBRE corchetes);
corchetes: CORCHETEA (RANGO|NOMBRE|NUMERO)? CORCHETEC;
definicion_codigo_C: (ABRE_SCC  (tipodato NOMBRE PUNTOCOMA)+ CIERRA_SCC);
tipodato: (INT | SHORT | LONG | DOUBLE | CHAR | VOID);

//Sección de Reglas 
segunda_seccion: ((patron accion)+) ;

patron: (PATRON (PATRON_MULT)?);
accion: (NOMBRE (INCREMENTO|DECREMENTO) PUNTOCOMA);


//Sección de código
tercera_seccion: ((funcion)+);

funcion: (tipodato)? (NOMBRE IGUAL)? NOMBRE PARENTESISA argumentos LLAVEA ((linea|retorno) PUNTOCOMA)* LLAVEC;
linea: ((NOMBRE IGUAL NUMERO) | ((NOMBRE IGUAL)? NOMBRE PARENTESISA (argumentos)?));
retorno: RETURN (NOMBRE|NUMERO)?;
argumentos: (VOID | ((COMA)? (STRING | ((tipodato (ASTERISCO)?)? NOMBRE (corchetes)? )))*) PARENTESISC;
